package core.logic.services.createServices;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.TimeUnit;

import javax.swing.text.JTextComponent;

import controllers.createControllers.ToevoegenVluchtController;
import core.logic.dataAccess.EigenaarDAO;
import core.logic.dataAccess.LuchthavenDAO;
import core.logic.dataAccess.VliegtuigenDAO;
import core.logic.dataAccess.VluchtenDAO;
import core.logic.services.BemanningAanduidenService;
import core.logic.services.utilServices.ValidatieService;
import core.models.dataModels.BemanningAanduidenModel;
import core.models.dataModels.createModels.ToevoegenVluchtModel;
import core.models.domainModel.Eigenaar;
import core.models.domainModel.Vliegtuig;
import core.models.domainModel.Vlucht;

public class ToevoegenVluchtService 
{
	//Lieven Drijkoningen C1017178
	//Opmaken van model voor door te geven, random gate wordt hier
	//gegenereerd, luchthavens worden opgehaald, vliegtuigen worden opgehaald
	//UC 10.1 Vlucht toevoegen
	public static ToevoegenVluchtModel getToevoegenVluchtModel()
	{		
		ToevoegenVluchtModel model = new ToevoegenVluchtModel();
		//Ophalen van alle luchthavens waaruit gekozen kan worden
		model.set_mogelijkeLuchthavens(LuchthavenDAO.getAllLuchthavens());		
		//Ophalen van alle eigenaars waaruit gekozen worden
		model.set_mogelijkeEigenaars(EigenaarDAO.getAllEigenaars());
		//Genereren van de random gate en meegeven aan model
		int gate = (int)(Math.random() * 20 + 1);
		model.set_gate(gate);		
		return model;
	}	
	//Toevoegen van de vlucht in het systeem
	//Lieven Drijkoningen
	//UC 10.1 S14
	public static BemanningAanduidenModel insertVluchtModel(ToevoegenVluchtModel m)
	{
		VluchtenDAO.insertVlucht(m);
		//BemanningAanduidenService.insertPersoneelIntoVlucht(m);
		Vlucht  x = new Vlucht();
		x.set_vluchtId(m.get_vluchtId());
		x.setVliegtuig(m.get_vliegtuig());
		BemanningAanduidenModel y = new BemanningAanduidenModel();
		y.setEigenaar(m.get_vliegtuig().get_eigenaar());
		y.setEnkeleVlucht(x);
		return y;
	}
	//Terugsturen van een arraylist met vliegtuigen gebaseerd op geselecteerde eigenaar
	//LIeven Drijkoningen
	//UC 10.1 S02
	public static ArrayList<Vliegtuig> getVliegtuigBySelectedEigenaar(Eigenaar e)
	{
		ArrayList<Vliegtuig> listVliegtuig = new ArrayList<Vliegtuig>();
		listVliegtuig = VliegtuigenDAO.getVliegtuigByEigenaar(e);
		return listVliegtuig;
	}
	
	// Bertels Nick c1019387
	// Voor het bepalen van een lange afstandsvlucht
	public static int tijdsverschilInMinuten(JTextComponent vertrekTijd , JTextComponent aankomstTijd)
	{
	SimpleDateFormat format = new SimpleDateFormat("dd/MM/yy HH:mm");
	
	Date dateVertrek = null , dateAankomst = null;
		
	try {
		dateVertrek = (Date) format.parse(vertrekTijd.getText());
	} catch (ParseException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	try {
		dateAankomst = (Date) format.parse(aankomstTijd.getText());
	} catch (ParseException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	//tijdsverschil in milliseconden
	final long tijdsverschil = dateAankomst.getTime() - dateVertrek.getTime(); 
	
	//tijd omzetten van milliseconden naar minuten
	final long tijdsverschilInMinuten = TimeUnit.MILLISECONDS.toMinutes(tijdsverschil);
	
	return (int) tijdsverschilInMinuten;
	}
	
	
	// Bertels Nick c1019387
	public static ArrayList<Vliegtuig> updateVliegtuigen (JTextComponent txtVertrekTijd,JTextComponent txtAankomstTijd , Eigenaar e)
	{
		// controle velden
		boolean controleOk = false; 
		ArrayList<Vliegtuig> alleVliegtuigen = new ArrayList<Vliegtuig>();
		ArrayList<Vliegtuig> vliegtuigen = new ArrayList<Vliegtuig>();
		
		if(ValidatieService.isPresentAndLength(txtVertrekTijd, 45, txtVertrekTijd.getName()))
			if(ValidatieService.isTijd(txtVertrekTijd, txtVertrekTijd.getName()))
				if(ValidatieService.isPresentAndLength(txtAankomstTijd, 45, txtAankomstTijd.getName()))
					if(ValidatieService.isTijd(txtAankomstTijd, txtAankomstTijd.getName()))
						controleOk = true;

		if (controleOk)
		{
			
			alleVliegtuigen = ToevoegenVluchtService.getVliegtuigBySelectedEigenaar(e);

    		// ( vlucht korte afstand ) vliegtuigen met minder dan 150 zitplaatsen toevoegen
    		if(ToevoegenVluchtService.tijdsverschilInMinuten(txtVertrekTijd,txtAankomstTijd) < 200)
    		{
        		for (Vliegtuig z: alleVliegtuigen)
        		{
        			if ((z.get_aantalRijenBusiness() * z.get_aantalZetelsPerRij()) + (z.get_aantalRijenEconomy() * z.get_aantalZetelsPerRij()) <=  150)
        				vliegtuigen.add(z);
        			
        		}
    		}
    		// ( vlucht lange afstand ) vliegtuigen met 150 of meer zitplaatsen toevoegen
    		else
    		{
        		for (Vliegtuig z: alleVliegtuigen)
        		{
        			if ((z.get_aantalRijenBusiness() * z.get_aantalZetelsPerRij()) + (z.get_aantalRijenEconomy() * z.get_aantalZetelsPerRij()) > 150)
        				vliegtuigen.add(z);
        		}
    		} 
		}
		return vliegtuigen;
	}

}
